'use strict';

const Service = require('egg').Service;
const crypto = require('crypto');

class UserService extends Service {
  /**
   * 用户登录
   * @param {Object} loginInfo - 登录信息
   * @return {Object} 用户信息和token
   */
  async login(loginInfo) {
    const { ctx } = this;
    const { username, password } = loginInfo;

    // 查找用户
    const user = await ctx.model.User.findOne({
      where: { phone: username, del_flag: 0 }  // 使用 phone 字段作为登录名
    });

    if (!user) {
      ctx.throw(404, '用户不存在');
    }

    // MD5加密密码进行比对
    const hashedPassword = crypto.createHash('md5')
      .update(password)
      .digest('hex');

    if (hashedPassword !== user.password) {
      ctx.throw(400, '密码错误');
    }

    if (user.status === 0) {
      ctx.throw(403, '账号已被禁用');
    }

    // 生成token
    const token = ctx.app.jwt.sign({
      id: user.id,
      phone: user.phone,
      user_type: user.user_type
    }, ctx.app.config.jwt.secret);

    return { token, userInfo: this.formatUserInfo(user) };
  }

  /**
   * 获取用户信息
   * @param {Number} userId - 用户ID
   * @return {Object} 用户信息
   */
  async getUserInfo(userId) {
    const { ctx } = this;
    const user = await ctx.model.User.findByPk(userId);

    if (!user) {
      ctx.throw(404, '用户不存在');
    }

    return this.formatUserInfo(user);
  }

  /**
   * 获取用户列表
   * @param {Object} params - 查询参数
   * @return {Object} 用户列表和分页信息
   */
  async getList(params) {
    const { ctx } = this;
    const { page = 1, pageSize = 10, username, status } = params;

    const where = {
      del_flag: 0
    };

    if (username) {
      where.username = {
        [ctx.model.Sequelize.Op.like]: `%${username}%`
      };
    }
    if (status !== undefined) {
      where.status = parseInt(status);
    }

    const { count, rows } = await ctx.model.User.findAndCountAll({
      where,
      order: [['created_at', 'DESC']],
      offset: (page - 1) * pageSize,
      limit: parseInt(pageSize),
      attributes: { exclude: ['password', 'del_flag'] }
    });

    return {
      list: rows,
      pagination: {
        total: count,
        current: parseInt(page),
        pageSize: parseInt(pageSize),
      }
    };
  }

  /**
   * 创建用户
   * @param {Object} userInfo - 用户信息
   * @return {Object} 创建的用户信息
   */
  async create(userInfo) {
    const { ctx } = this;
    const { phone, password } = userInfo;

    // 检查手机号是否已存在
    const existUser = await ctx.model.User.findOne({
      where: { phone, del_flag: 0 }
    });

    if (existUser) {
      ctx.throw(400, '手机号已存在');
    }

    // MD5加密密码
    const hashedPassword = crypto.createHash('md5')
      .update(password)
      .digest('hex');

    const user = await ctx.model.User.create({
      ...userInfo,
      password: hashedPassword
    });

    return this.formatUserInfo(user);
  }

  /**
   * 更新用户信息
   * @param {Number} id - 用户ID
   * @param {Object} updateInfo - 更新信息
   * @return {Object} 更新后的用户信息
   */
  async update(id, updateInfo) {
    const { ctx } = this;
    const user = await ctx.model.User.findByPk(id);

    if (!user) {
      ctx.throw(404, '用户不存在');
    }

    // 如果更新密码，需要MD5加密
    if (updateInfo.password) {
      updateInfo.password = crypto.createHash('md5')
        .update(updateInfo.password)
        .digest('hex');
    }

    await user.update(updateInfo);
    return this.formatUserInfo(user);
  }

  /**
   * 更新用户状态
   * @param {Number} id - 用户ID
   * @param {Number} status - 状态值
   */
  async updateStatus(id, status) {
    const { ctx } = this;
    const user = await ctx.model.User.findByPk(id);

    if (!user) {
      ctx.throw(404, '用户不存在');
    }

    await user.update({ status });
  }

  /**
   * 删除用户（软删除）
   * @param {Number} id - 用户ID
   */
  async destroy(id) {
    const { ctx } = this;
    const user = await ctx.model.User.findByPk(id);

    if (!user) {
      ctx.throw(404, '用户不存在');
    }

    await user.update({ del_flag: 1 });
  }

  /**
   * 格式化用户信息（去除敏感字段）
   * @param {Object} user - 用户对象
   * @return {Object} 格式化后的用户信息
   */
  formatUserInfo(user) {
    const { password, del_flag, ...rest } = user.toJSON();
    return rest;
  }

  /**
   * 查找所有用户
   * @param {Object} params - 查询参数
   * @return {Object} 用户列表和分页信息
   */
  async findAll(params = {}) {
    const { ctx } = this;
    const { phone, nickname, user_type, status, page = 1, pageSize = 10 } = params;

    const where = {
      del_flag: 0
    };

    if (phone) {
      where.phone = {
        [ctx.model.Sequelize.Op.like]: `%${phone}%`
      };
    }
    if (nickname) {
      where.nickname = {
        [ctx.model.Sequelize.Op.like]: `%${nickname}%`
      };
    }
    if (user_type) where.user_type = user_type;
    if (status !== undefined) where.status = parseInt(status);

    const { count, rows } = await ctx.model.User.findAndCountAll({
      where,
      order: [['created_at', 'DESC']],
      offset: (page - 1) * pageSize,
      limit: parseInt(pageSize),
      attributes: { exclude: ['password', 'del_flag'] }
    });

    return {
      list: rows,
      pagination: {
        total: count,
        current: parseInt(page),
        pageSize: parseInt(pageSize),
      }
    };
  }
}

module.exports = UserService; 